package com.duoduo.链表;

import com.duoduo.ListNode;

/**
 * @program: algorithm
 * @description: 反转链表206
 * 给你单链表的头节点 head ，请你反转链表，并返回反转后的链表。
 * 输入：head = [1,2,3,4,5]
 * 输出：[5,4,3,2,1]
 * @author: chaidl  ！
 * @create: 2022-03-23 14:41
 */
public class 反转链表206 {
    //递归
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        //递拿到最后一个节点
        ListNode newNode = reverseList(head.next);
        //归，将当前节点下一个节点的下一个节点指向当前节点
        head.next.next = head;
        head.next = null;
        return newNode;
    }

    //迭代
    public ListNode reverseList2(ListNode head) {
        //定义两个指针，一个前指针和一个当前节点指针
        ListNode prev = null;
        ListNode curr = head;
        //当前节点一直往右递归，直到为空
        while (curr != null) {
            ListNode nextNode = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextNode;
        }
        return prev;
    }
}
